package com.imooc.mall.exception;

import com.imooc.mall.common.ApiRestResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.List;

/*
*  请求返回的参数中不应该出现(程序内部的错误)要对这个异常的错误代码进行全部的获取
*
*  统一处理异常信息 对数据进行
* */
// 全局异常捕获类
@ControllerAdvice
public class GloabalExceptionHandler {

    private final Logger logger = LoggerFactory.getLogger(GloabalExceptionHandler.class);

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Object handleException(Exception e){
        logger.error("Default Exception", e);
        return ApiRestResponse.error(ImoocMallExceptionEnum.SYSTEM_ERROR);
    }


    // 会出现异常出现的地方，在页面的显示上出错误的信息的错误来的，让我们来进行。
    @ExceptionHandler(ImoocMallException.class)
    @ResponseBody
    public Object handleException(ImoocMallException e){
        logger.error("ImoocMallException", e);
        return ApiRestResponse.error(e.getCode(),e.getMessage());
    }

    /*参数异常往外面抛出错误的*/
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public ApiRestResponse handleMethodArgumentNotValidException(MethodArgumentNotValidException e)
    {
        logger.error("MethodArgumentNotValidException", e);
        return handleBindingResult(e.getBindingResult());
    }

    private ApiRestResponse handleBindingResult (BindingResult result){
        // 将异常处理为外在暴露的提示
        List<String> list = new ArrayList<>();
        if(result.hasErrors()){
            List<ObjectError> allErrors = result.getAllErrors();
            for(ObjectError objectError:allErrors){
                String message = objectError.getDefaultMessage();
                list.add(message);
            }
        }
        if(list == null){
            return ApiRestResponse.error(ImoocMallExceptionEnum.REQUEST_PARAM_ERROR);
        }
        return ApiRestResponse.error(ImoocMallExceptionEnum.REQUEST_PARAM_ERROR.getCode(),list.toString());
    }
}